﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using sqszerelo.BO;

namespace sqszerelo
{
    public class UI
    {
        public enum MainStep
        {
            NewMunkalap,
            SearchMunkalap,
            Exit
        }

        public enum MunkalapStep
        {
            Export,
            Edit,
            Cancel
        }

        public enum MunkalapEditStep
        {
            NewMunkafolyamat,
            NewAnyag,
            DeleteMunkalap,
            CloseMunkalap,
            Cancel
        }

        public class SearchPattern
        {
            public string FelvevoNeve;
            public DateTime? FelvetelIdeje;
            public String AutoTulajdonosNeve;
        }

        public MainStep GetMainStep()
        {
            Console.WriteLine("Főmenü" + Environment.NewLine);
            Console.WriteLine("Mi történjen?");
            for (; ; )
            {
                Console.WriteLine("A lehetőségek:");
                Console.WriteLine("0 - Új munkalap létrehozása");
                Console.WriteLine("1 - Munkalap előkeresése");
                Console.WriteLine("2 - Kilépés a programból");

                Console.WriteLine("Üsd le a megfelelő szám billentyűjét");
                ConsoleKeyInfo key = Console.ReadKey();
                Console.WriteLine();

                switch (key.KeyChar)
                {
                    case '0':
                        return MainStep.NewMunkalap;
                    case '1':
                        return MainStep.SearchMunkalap;
                    case '2':
                        return MainStep.Exit;
                }

                Console.WriteLine("Nem a megadott lehetőségek közül választottál!");
            }
        }

        public MunkalapStep GetMunkalapStep()
        {
            Console.WriteLine("Mi történjen a kiválasztott munkalappal?");
            for (; ; )
            {
                Console.WriteLine("A lehetőségek:");
                Console.WriteLine("0 - Munkalap szerkesztése");
                Console.WriteLine("1 - Munkalap exportálása");
                Console.WriteLine("2 - Visszalépés a főmenübe");

                Console.WriteLine("Üsd le a megfelelő szám billentyűjét");
                ConsoleKeyInfo key = Console.ReadKey();
                Console.WriteLine();

                switch (key.KeyChar)
                {
                    case '0':
                        return MunkalapStep.Edit;
                    case '1':
                        return MunkalapStep.Export;
                    case '2':
                        return MunkalapStep.Cancel;
                }

                Console.WriteLine("Nem a megadott lehetőségek közül választottál!");
            }
        }

        public MunkalapEditStep GetMunkalapEditStep(Munkalap munkalap)
        {
            Console.WriteLine("Hogy szeretnéd szerkeszteni a munkalapot?");
            for (; ; )
            {
                Console.WriteLine("A lehetőségek:");
                if (!munkalap.Lezarva)
                {
                    Console.WriteLine("0 - Anyag hozzáadása");
                    Console.WriteLine("1 - Munkafolyamat hozzáadása");
                    Console.WriteLine("2 - Munkalap lezárása (Ellenőrizd, hogy ki van-e fizetve!)");
                }
                else
                {
                    Console.WriteLine("3 - Munkalap törlése");
                }
                Console.WriteLine("4 - Visszalépés a főmenübe");

                Console.WriteLine("Üsd le a megfelelő szám billentyűjét");
                ConsoleKeyInfo key = Console.ReadKey();
                Console.WriteLine();

                if (!munkalap.Lezarva)
                {
                    switch (key.KeyChar)
                    {
                        case '0':
                            return MunkalapEditStep.NewAnyag;
                        case '1':
                            return MunkalapEditStep.NewMunkafolyamat;
                        case '2':
                            return MunkalapEditStep.CloseMunkalap;
                        case '4':
                            return MunkalapEditStep.Cancel;
                    }
                }
                else
                {
                    switch (key.KeyChar)
                    {
                        case '3':
                            return MunkalapEditStep.DeleteMunkalap;
                        case '4':
                            return MunkalapEditStep.Cancel;
                    }
                }


                Console.WriteLine("Nem a megadott lehetőségek közül választottál!");
            }
        }

        public SearchPattern GetMunkalapSearchPattern()
        {
            Console.WriteLine("Munkalap keresése" + Environment.NewLine);

            SearchPattern pattern = new SearchPattern();

            //***** munkalap felvevő neve
            Console.WriteLine("Add meg a munkalap felvevőjének a nevének egy részletét");
            Console.WriteLine("Vagy hagyd üresen (csak üss ENTER-t), ha bármelyik név jó");
            pattern.FelvevoNeve = Console.ReadLine();


            //***** Jármű tulaj neve
            Console.WriteLine("Add meg a munkalapon szereplő jármű tulajdonosának nevének egy részletét");
            Console.WriteLine("Vagy hagyd üresen (csak üss ENTER-t), ha bármelyik név jó");
            pattern.AutoTulajdonosNeve = Console.ReadLine();

            //***** Dátum
            Console.WriteLine("Szeretnél a felvétel dátuma alapján is keresni?");
            bool kell = true;
            bool olvasva = false;
            for (; !olvasva; )
            {
                Console.WriteLine("A lehetőségek:");
                Console.WriteLine("0 - Nem");
                Console.WriteLine("1 - Igen");

                Console.WriteLine("Üsd le a megfelelő szám billentyűjét");
                ConsoleKeyInfo key = Console.ReadKey();
                Console.WriteLine();

                switch (key.KeyChar)
                {
                    case '0':
                        kell = false;
                        olvasva = true;
                        break;
                    case '1':
                        kell = true;
                        olvasva = true;
                        break;
                }

                Console.WriteLine("Nem a megadott lehetőségek közül választottál!");
            }

            if (kell)
            {
                int ev;
                for (; ; )
                {
                    Console.WriteLine("Év:");
                    string dS = Console.ReadLine();



                    if (int.TryParse(dS, out ev) && ev >= 1990 && ev <= 9999)
                    {
                        break;
                    }
                    else
                    {
                        Console.WriteLine("A beírt szöveg nem szám vagy kissebb mint 1990 vagy nagyobb mint 9999");
                    }
                }

                int honap;
                for (; ; )
                {
                    Console.WriteLine("Hónap:");
                    string dS = Console.ReadLine();

                    if (int.TryParse(dS, out honap) && honap >= 1 && honap <= 12)
                    {
                        break;
                    }
                    else
                    {
                        Console.WriteLine("A beírt szöveg nem szám vagy kissebb mint 1 vagy nagyobb mint 12");
                    }
                }

                int nap;
                for (; ; )
                {
                    Console.WriteLine("Nap:");
                    string dS = Console.ReadLine();

                    if (int.TryParse(dS, out nap) && nap >= 1 && nap <= 31)
                    {
                        if (honap == 2 && nap > 29)
                        {
                            Console.WriteLine("A február csak 29 napos"); //TODO: szökőévvel számolni
                        }
                        else if (honap == 4 && nap > 30)
                        {
                            Console.WriteLine("Az április  csak 30 napos");
                        }
                        else if (honap == 6 && nap > 30)
                        {
                            Console.WriteLine("A június csak 30 napos");
                        }
                        else if (honap == 9 && nap > 30)
                        {
                            Console.WriteLine("A szeptember csak 30 napos");
                        }
                        else if (honap == 11 && nap > 30)
                        {
                            Console.WriteLine("A november csak 30 napos");
                        }
                        else
                        {
                            break;
                        }
                    }
                    else
                    {
                        Console.WriteLine("A beírt szöveg nem szám vagy kissebb mint 1 vagy nagyobb mint 31");
                    }
                }

                pattern.FelvetelIdeje = new DateTime(ev, honap, nap);
            }
            else
            {
                pattern.FelvetelIdeje = null;
            }



            return pattern;
        }

        public Munkalap GetNewMunkalap()
        {
            Console.WriteLine("Munkalap beolvasása" + Environment.NewLine);

            Munkalap munkalap = new Munkalap();

            for (; ; )
            {
                Console.WriteLine("Munkafelvevő neve: ");
                munkalap.Munkafelvevo = Console.ReadLine();

                string error = munkalap.MunkafelvevoIsValid();
                if (error == null)
                {
                    break;
                }

                Console.WriteLine(error + Environment.NewLine);
            }

            Console.WriteLine("A jármű adatai" + Environment.NewLine);
            Gepjarmu jarmu = munkalap.Jarmu;

            for (; ; )
            {
                Console.WriteLine("Jármű gyártmánya: ");
                jarmu.Gyartmany = Console.ReadLine();

                string error = jarmu.GyartmanyIsValid();
                if (error == null)
                {
                    break;
                }

                Console.WriteLine(error + Environment.NewLine);
            }

            for (; ; )
            {
                Console.WriteLine("Jármű típusa: ");
                jarmu.Tipus = Console.ReadLine();

                string error = jarmu.TipusIsValid();
                if (error == null)
                {
                    break;
                }

                Console.WriteLine(error + Environment.NewLine);
            }

            for (; ; )
            {
                Console.WriteLine("Jármű rendszáma: ");
                jarmu.Rendszam = Console.ReadLine();

                string error = jarmu.RendszamIsValid();
                if (error == null)
                {
                    break;
                }

                Console.WriteLine(error + Environment.NewLine);
            }


            Console.WriteLine("A vevő adatai" + Environment.NewLine);
            Vevo vevo = munkalap.Vevo;

            for (; ; )
            {
                Console.WriteLine("Vevő neve: ");
                vevo.Nev = Console.ReadLine();

                string error = vevo.NevIsValid();
                if (error == null)
                {
                    break;
                }

                Console.WriteLine(error + Environment.NewLine);
            }

            for (; ; )
            {
                Console.WriteLine("Vevő címe: ");
                vevo.Cim = Console.ReadLine();

                string error = vevo.CimIsValid();
                if (error == null)
                {
                    break;
                }

                Console.WriteLine(error + Environment.NewLine);
            }

            return munkalap;
        }

        public int GetAnyag(Anyag[] anyagok)
        {
            Console.WriteLine("Anyag választása" + Environment.NewLine);
            Console.WriteLine("A lehetőségek:");
            for (int i = 0; i < anyagok.Length; ++i)
            {
                Anyag anyag = anyagok[i];
                Console.WriteLine("{0}. - {1}  ({2} Ft/{3}) ", i, anyag.Nev, anyag.Ar, anyag.EgysegNev);

                if (i % 9 == 0)
                {
                    Console.ReadKey();
                    Console.WriteLine("A folytatáshoz nyomj le egy billentyűt");
                }
            }

            int sorszam;
            for (; ; )
            {
                Console.WriteLine("Írd be a kiválaszott anyag sorszámát");
                string sorszS = Console.ReadLine();

                if (int.TryParse(sorszS, out sorszam) && sorszam >= 0)
                {
                    if (sorszam >= 0 && sorszam <= anyagok.Length - 1)
                    {
                        break;
                    }
                    else
                    {
                        Console.WriteLine("A beírt szám nem egy anyag sorszáma");
                    }
                }
                else
                {
                    Console.WriteLine("A beírt szöveg nem természetes szám vagy nagyobb mint " + int.MaxValue);
                }
            }

            return sorszam;
        }

        public Munkafolyamat GetMunkafolyamat(MunkafolyamatTipus[] munkafolyamatok, string[] szerelok)
        {
            Console.WriteLine("Munkafolyamat beolvasása" + Environment.NewLine);

            Munkafolyamat munkafolyamat = new Munkafolyamat();

            Console.WriteLine("Munkafolyamat típus választása" + Environment.NewLine);
            Console.WriteLine("A lehetőségek:");
            for (int i = 0; i < munkafolyamatok.Length; ++i)
            {
                MunkafolyamatTipus munkafolyamatTipus = munkafolyamatok[i];
                Console.WriteLine("{0}. - {1}  ({2} Ft/óra) ", i, munkafolyamatTipus.Nev, munkafolyamatTipus.Ar);

                if (i % 9 == 0)
                {
                    Console.ReadKey();
                    Console.WriteLine("A folytatáshoz nyomj le egy billentyűt");
                }
            }

            for (; ; )
            {
                int sorszam;
                Console.WriteLine("Írd be a kiválaszott munkafolyamat típus sorszámát");
                string sorszS = Console.ReadLine();

                if (int.TryParse(sorszS, out sorszam) && sorszam >= 0)
                {
                    if (sorszam >= 0 && sorszam <= munkafolyamatok.Length - 1)
                    {
                        munkafolyamat.Nev = munkafolyamatok[sorszam].Nev;
                        munkafolyamat.Ar = munkafolyamatok[sorszam].Ar;
                        break;
                    }
                    else
                    {
                        Console.WriteLine("A beírt szám nem egy munkafolyamat típus sorszáma");
                    }
                }
                else
                {
                    Console.WriteLine("A beírt szöveg nem természetes szám vagy nagyobb mint " + int.MaxValue);
                }
            }

            Console.WriteLine(Environment.NewLine + "Szerelő választása" + Environment.NewLine);
            Console.WriteLine("A lehetőségek:");
            for (int i = 0; i < szerelok.Length; ++i)
            {
                string szerelo = szerelok[i];
                Console.WriteLine("{0}. - {1}", i, szerelo);
            }

            for (; ; )
            {
                int sorszam;
                Console.WriteLine("Írd be a kiválaszott szerelő sorszámát");
                string sorszS = Console.ReadLine();

                if (int.TryParse(sorszS, out sorszam) && sorszam >= 0)
                {
                    if (sorszam >= 0 && sorszam <= szerelok.Length - 1)
                    {
                        munkafolyamat.SzereloNev = szerelok[sorszam];
                        break;
                    }
                    else
                    {
                        Console.WriteLine("A beírt szám nem egy szerelő sorszáma");
                    }
                }
                else
                {
                    Console.WriteLine("A beírt szöveg nem természetes szám vagy nagyobb mint " + int.MaxValue);
                }
            }

            Console.WriteLine(Environment.NewLine + "Mennyi ideig tartott a munkafolyamat?");
            for (; ; )
            {
                int hossz;
                Console.WriteLine("Írd be a munkafolyamat hosszát órában");
                string sorszS = Console.ReadLine();

                if (int.TryParse(sorszS, out hossz) && hossz >= 0)
                {
                    munkafolyamat.MunkaHossza = hossz;
                    break;
                }
                else
                {
                    Console.WriteLine("A beírt szöveg nem természetes szám vagy nagyobb mint " + int.MaxValue);
                }
            }

            return munkafolyamat;
        }

        public void OnMunkalapExported(Munkalap munkalap, string fileName)
        {
            Console.WriteLine("A munkalap exportálva lett");
        }

        public void OnMunkalapDeleted(Munkalap munkalap)
        {
            Console.WriteLine("A munkalap törölve lett");
        }

        public void OnMunkalapClosed(Munkalap munkalap)
        {
            Console.WriteLine("A munkalap le lett zárva");
        }

        public int SelectMunkalap(Munkalap[] munkalapok)
        {
            Console.WriteLine("Munkalap választása" + Environment.NewLine);
            if (munkalapok.Length == 0)
            {
                Console.WriteLine("Nincs találat. Visszatérsz a főmenübe");
                return -1;
            }

            Console.WriteLine("A lehetőségek:");
            for (int i = 0; i < munkalapok.Length; ++i)
            {
                Munkalap munkalap = munkalapok[i];
                Console.WriteLine(
                    "{0}. - Munkafelvevő: {1} " + Environment.NewLine +
                    "Vevő: {2} {3}" + Environment.NewLine +
                    "Jármű: {4} {5} Rendszám: {6}" + Environment.NewLine +
                    "Ár: {7}" + Environment.NewLine,
                    i,
                    munkalap.Munkafelvevo,
                    munkalap.Vevo.Nev,
                    munkalap.Vevo.Cim,
                    munkalap.Jarmu.Gyartmany,
                    munkalap.Jarmu.Tipus,
                    munkalap.Jarmu.Rendszam,
                    munkalap.Ar
                    );

                if (i % 9 == 0)
                {
                    Console.ReadKey();
                    Console.WriteLine("A folytatáshoz nyomj le egy billentyűt");
                }
            }

            int sorszam;
            for (; ; )
            {
                Console.WriteLine("Írd be a kiválaszott munkalap sorszámát");
                string sorszS = Console.ReadLine();

                if (int.TryParse(sorszS, out sorszam) && sorszam >= 0)
                {
                    if (sorszam >= 0 && sorszam <= munkalapok.Length - 1)
                    {
                        break;
                    }
                    else
                    {
                        Console.WriteLine("A beírt szám nem egy munkalap sorszáma");
                    }
                }
                else
                {
                    Console.WriteLine("A beírt szöveg nem természetes szám vagy nagyobb mint " + int.MaxValue);
                }
            }

            return sorszam;
        }
    }
}
